﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/*
 * 功能、性能验证
 * 
 * 函数名 VerifyPerformance 开头表示性能验证，后面 _ 分割开的为验证的内容/方式等
 * 函数名 VerifyFunction 开头表示功能调研/验证
 * 
 * 辅助函数以 Test_开头，加上验证函数后半部分，且函数紧跟其后
 */

namespace ConsoleTest
{
    static class VerifyCases
    {
        //// 结论：直接调用更好
        //public static void VerifyPerformance_Delegate_Class()
        //{
        //    Stopwatch sw = new Stopwatch();
        //    Action<int> act = new Action<int>(Test_Delegate_Class);
        //    sw.Start();
        //    int cnt = 1000;
        //    for (int j = 0; j < cnt; j++)
        //    {
        //        act(100);
        //    }
        //    sw.Stop();
        //    Console.WriteLine();
        //    Console.WriteLine("委托方式用时：{0}", sw.Elapsed);

        //    sw.Restart();
        //    for (int j = 0; j < cnt; j++)
        //    {
        //        Test_Delegate_Class(100);
        //    }
        //    sw.Stop();
        //    Console.WriteLine();
        //    Console.WriteLine("直接方式用时：{0}", sw.Elapsed);
        //    Console.ReadKey();
        //}
        //static void Test_Delegate_Class(int cnt)
        //{
        //    for (int i = 0; i < cnt; i++)
        //    {
        //        Console.Write($"\rcurrent value：{i}");
        //    }
        //}

        //// 结论：多次测试可以看测撸代码更好
        //public static void VerifyPerformance_LINQ_Code()
        //{
        //    Stopwatch sw = new Stopwatch();

        //    sw.Start();
        //    int cnt = 55500;
        //    TestPerformance_Code(cnt);
        //    sw.Stop();
        //    Console.WriteLine();
        //    Console.WriteLine($"code:\t{sw.Elapsed}");

        //    sw.Restart();
        //    TestPerformance_LINQ(cnt);
        //    sw.Stop();
        //    Console.WriteLine();
        //    Console.WriteLine($"linq:\t{sw.Elapsed}");
        //}
        //static void TestPerformance_LINQ(int cnt)
        //{
        //    string result = "00000120/00000F01";
        //    for (int i = 0; i < cnt; i++)
        //    {
        //        Console.Write($"\r{(from c in result.Split('/') select Convert.ToInt32(c, 16)).ToArray()}");
        //    }
        //}
        //static void TestPerformance_Code(int cnt)
        //{
        //    string result = "00000120/00000F01";
        //    //string[] tmp;
        //    for (int i = 0; i < cnt; i++)
        //    {
        //        //tmp = result.Split('/');
        //        //Console.Write($"\r{new int[] { Convert.ToInt32(tmp[0], 16), Convert.ToInt32(tmp[1], 16) }}");

        //        Console.Write($"\r{new int[] { Convert.ToInt32(result.Substring(0, 8), 16), Convert.ToInt32(result.Substring(9, 8), 16) }}");
        //    }
        //}

        //public static float Rsqrt(float num)
        //{
        //    long i;
        //    float x2, y;
        //    float threehalfs = 1.5f;
        //    x2 = num * 0.5f;
        //    y = num;
        //    unsafe
        //    {
        //        i = *(long*)&y;
        //        i = 0x5f3759df - (i >> 1);
        //        //i = 0x5f32cf9d - (i >> 1);
        //        y = *(float*)&i;
        //        y = y * (threehalfs - (x2 * y * y));
        //        y = y * (threehalfs - (x2 * y * y));
        //        y = y * (threehalfs - (x2 * y * y));
        //    }
        //    return y;
        //}
    }
}
